package com.project.srtp.secure.controller;

import com.project.srtp.secure.common.result.Result;
import com.project.srtp.secure.common.result.Results;
import com.project.srtp.secure.dto.req.CheckRuleASTNodeReqDTO;
import com.project.srtp.secure.dto.req.ComplianceRuleReqDTO;
import com.project.srtp.secure.dao.entity.ComplianceRuleDO;
import com.project.srtp.secure.dto.resp.AstNodeRespDto;
import com.project.srtp.secure.dto.resp.RulesRespDTO;
import com.project.srtp.secure.service.ComplianceService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * @author 曹行阳
 * @version 0.1
 * @date 2025/6/11 11:17
 */
@RestController
@RequiredArgsConstructor
public class ComplianceRuleController {

    private final ComplianceService complianceService; // 合规规则管理服务

    /**
     * 创建合规规则
     *
     * @param reqDTO 包含规则定义数据的请求体
     * @return 空结果的成功响应
     *
     * 功能说明：
     * 1. 接收前端提交的合规规则定义
     * 2. 将规则持久化存储到规则库
     * 3. 适用于风控规则、审计规则等业务场景
     */
    @PostMapping("/api/rule/insertRule")
    public Result<Void> createRule(@RequestBody ComplianceRuleReqDTO reqDTO) {
        complianceService.createRule(reqDTO); // 调用服务层创建规则
        return Results.success(); // 返回操作成功响应
    }

    /**
     * 检查规则语法节点（抽象语法树解析）
     *
     * @param request 包含待检查规则表达式的请求体
     * @return 包含AST解析结果的成功响应
     *
     * 功能说明：
     * 1. 对规则表达式进行语法解析和验证
     * 2. 返回抽象语法树节点结构
     * 3. 用于规则配置时的实时语法检查
     */
    @PostMapping("/api/rule/checkRuleASTNode")
    public Result<AstNodeRespDto> checkRuleASTNode(@RequestBody CheckRuleASTNodeReqDTO request) {
        // 解析规则表达式并返回AST节点结构
        return Results.success(complianceService.checkRuleASTNode(request));
    }

    /**
     * 获取所有合规规则
     *
     * @return 包含规则列表的成功响应
     *
     * 功能说明：
     * 1. 从规则库查询全部已定义的合规规则
     * 2. 返回规则基础信息（不含详细逻辑）
     * 3. 适用于规则管理界面展示
     */
    @GetMapping("/api/rule/getAllRules")
    public Result<List<RulesRespDTO>> getAllRules(){
        return Results.success(complianceService.getAllRules()); // 获取全量规则列表
    }
}
